package com.zhiche.lisa.bms.service.utils.common.identityCodeUtil.item;

import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zhiche.lisa.bms.dao.model.contract.Contract;
import com.zhiche.lisa.bms.service.contract.ContractService;
import com.zhiche.lisa.bms.service.utils.common.identityCodeUtil.CodeSuper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: liuanshun
 * @Description: 用于生成合同Code
 * @Date: Create in 14:23 2018/11/3
 */
@Deprecated
public class ContractCode extends CodeSuper {
	private final Logger LOGGER = LoggerFactory.getLogger(ContractCode.class);

	/**
	 * 合同Service，用于初始化时查询数据库
	 */
	private ContractService contractService;

	/**
	 * 手动标识{***}为动态数据，[***]为固态数据
	 *
	 * @param contractService
	 */
	public ContractCode(ContractService contractService) {
		this.contractService = contractService;
		this.mapper = new HashMap<>();
		mapper.put("yyyy", String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
		this.codeFactory = "{CCN}-FVS-[yyyy]-[incrementId]";
	}

	/**
	 * 指定获取4位数
	 *
	 * @return
	 */
	@Override
	protected String getNextIncrementId() {
		int newNum = codeId.incrementAndGet();
		//数字长度为4位，长度不够数字前面补0
		String newStrNum = String.format("%04d", newNum);
		return newStrNum;
	}

	/**
	 * 获取下一个code
	 *
	 * @param valueMapping 动态映射字符（传入以格式定义关键字为key的映射值）
	 * @return 转换后的code结果
	 */
	@Override
	public String getNextCode(Map<String, String> valueMapping) {
		//没有传入映射方式值的时候，默认使用基类的实现方式
		if (CollectionUtils.isEmpty(valueMapping)) {
			return super.getNextCode(null);
		}
		//判断固定生成的时间映射，是否为当前年份
		if (String.valueOf(Calendar.getInstance().get(Calendar.YEAR)).equals(mapper.get("yyyy"))) {
			/*
			 * 相同，映射年结果与现在时间不冲突，继续使用指定方式绑定
			 */
			String replaceStr = codeFactory;
			//遍历同步固定资源，并替换结果值
			for (Map.Entry<String, String> item :
					mapper.entrySet()) {
				replaceStr = StringUtils.replace(replaceStr, "[" + item.getKey() + "]", item.getValue());
			}
			//遍历非固定值的动态资源，并替换结果值
			for (Map.Entry<String, String> item :
					valueMapping.entrySet()) {
				//判断是否为指定的CCN关键字
				if ("CCN".equals(item.getKey())) {
					//通过CCN映射结果方式替换结果
					replaceStr = StringUtils.replace(replaceStr, "{" + item.getKey() + "}", contractCreateNameMapping.get(item.getValue()));
				} else {
					//按默认方式替换
					replaceStr = StringUtils.replace(replaceStr, "{" + item.getKey() + "}", item.getValue());
				}
			}
			//替换生成的id号
			replaceStr = StringUtils.replace(replaceStr, "[incrementId]", this.getNextIncrementId());
			return replaceStr;
		} else {
			/*
			 * 不相同，更新映射值，并初始化剩余资源，
			 */
			mapper.put("yyyy", String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
			this.init();
			//继续调用自身，重新转换
			return this.getNextCode(valueMapping);
		}
	}

	/**
	 * 初始化资源
	 *
	 * @return
	 */
	@Override
	public ContractCode init() {
		/*
		 * 按固定字符和额外的字符（‘-2017-’）寻找最进新增的code，并获取自增id号
		 */
		//按-yyyy-方式寻找最后一次保存的id
		EntityWrapper<Contract> contractEntityWrapper = new EntityWrapper<>();
		contractEntityWrapper.setSqlSelect("id");
		contractEntityWrapper.orderBy("id desc");
		contractEntityWrapper.like("cont_code", "%-" + mapper.get("yyyy") + "-%", SqlLike.CUSTOM);

		Long maxId = (Long) contractService.selectObj(contractEntityWrapper);

		/*
		 * 未存在值默认使用1
		 * 存在值使用截取出的id号
		 */
		if (maxId == null) {
			codeId = new AtomicInteger(1);
		} else {
			Contract contract = contractService.selectById(maxId);
			String[] split = contract.getContCode().split("-");
			String endStr = split[split.length - 1];
			if (org.apache.commons.lang3.StringUtils.isNumeric(endStr)) {
				codeId = new AtomicInteger(Integer.valueOf(endStr));
			}
		}
		return this;
	}

	/**
	 * CCN字符映射
	 */
	private final Map<String, String> contractCreateNameMapping = new HashMap<String, String>();

	//初始化CCN映射结果
	{
		contractCreateNameMapping.put("中联物流（中国）有限公司", "UNLCN");
		contractCreateNameMapping.put("测试承运商", "CESHI");
		contractCreateNameMapping.put("重庆分公司", "UNLCN-CQ");
		contractCreateNameMapping.put("湖南分公司", "UNLCN-HN");
		contractCreateNameMapping.put("江西分公司", "UNLCN-JX");
		contractCreateNameMapping.put("九江分公司", "UNLCN-JJ");
		contractCreateNameMapping.put("景德镇分公司", "UNLCN-JDZ");
		contractCreateNameMapping.put("江西诺信物流有限公司", "UNLCN-JXNX");
		contractCreateNameMapping.put("南昌中经物流有限公司", "UNLCN-NCZJ");
		contractCreateNameMapping.put("江西中联智能物流有限公司", "UNLCN-JXZN");
		contractCreateNameMapping.put("江西迅佳物流有限公司", "UNLCN-JXXJ");
		contractCreateNameMapping.put("江西路易通达运输有限公司", "LYTD");
		contractCreateNameMapping.put("景德镇久顺途运输有限公司", "JST");
		contractCreateNameMapping.put("江西佳迅运输有限公司", "JX");
		contractCreateNameMapping.put("鹰潭运捷运输有限公司", "YTYJ");
	}
}
